

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="Description" content="scikit-learn: machine learning in Python">

  
  <title>Roadmap &mdash; scikit-learn 0.22 documentation</title>
  
  <link rel="canonical" href="http://scikit-learn.org/stable/roadmap.html" />

  
  <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  <link rel="stylesheet" href="_static/css/vendor/bootstrap.min.css" type="text/css" />
  <link rel="stylesheet" href="_static/gallery.css" type="text/css" />
  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> 
</head>
<body>
<nav id="navbar" class="sk-docs-navbar navbar navbar-expand-md navbar-light bg-light py-0">
  <div class="container-fluid sk-docs-container px-0">
      <a class="navbar-brand py-0" href="index.html">
        <img
          class="sk-brand-img"
          src="_static/scikit-learn-logo-small.png"
          alt="logo"/>
      </a>
    <button
      id="sk-navbar-toggler"
      class="navbar-toggler"
      type="button"
      data-toggle="collapse"
      data-target="#navbarSupportedContent"
      aria-controls="navbarSupportedContent"
      aria-expanded="false"
      aria-label="Toggle navigation"
    >
      <span class="navbar-toggler-icon"></span>
    </button>

    <div class="sk-navbar-collapse collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="install.html">Install</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="user_guide.html">User Guide</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="modules/classes.html">API</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link" href="auto_examples/index.html">Examples</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="getting_started.html">Getting Started</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="tutorial/index.html">Tutorial</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="glossary.html">Glossary</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="developers/index.html">Development</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="faq.html">FAQ</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="related_projects.html">Related packages</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="#">Roadmap</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="about.html">About us</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="https://github.com/scikit-learn/scikit-learn">GitHub</a>
        </li>
        <li class="nav-item">
          <a class="sk-nav-link nav-link nav-more-item-mobile-items" href="https://scikit-learn.org/dev/versions.html">Other Versions</a>
        </li>
        <li class="nav-item dropdown nav-more-item-dropdown">
          <a class="sk-nav-link nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">More</a>
          <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <a class="sk-nav-dropdown-item dropdown-item" href="getting_started.html">Getting Started</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="tutorial/index.html">Tutorial</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="glossary.html">Glossary</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="developers/index.html">Development</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="faq.html">FAQ</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="related_projects.html">Related packages</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="#">Roadmap</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="about.html">About us</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="https://github.com/scikit-learn/scikit-learn">GitHub</a>
              <a class="sk-nav-dropdown-item dropdown-item" href="https://scikit-learn.org/dev/versions.html">Other Versions</a>
          </div>
        </li>
      </ul>
      <div id="searchbox" role="search">
          <div class="searchformwrapper">
          <form class="search" action="search.html" method="get">
            <input class="sk-search-text-input" type="text" name="q" aria-labelledby="searchlabel" />
            <input class="sk-search-text-btn" type="submit" value="Go" />
          </form>
          </div>
      </div>
    </div>
  </div>
</nav>
<div class="d-flex" id="sk-doc-wrapper">
    <input type="checkbox" name="sk-toggle-checkbox" id="sk-toggle-checkbox">
    <label id="sk-sidemenu-toggle" class="sk-btn-toggle-toc btn sk-btn-primary" for="sk-toggle-checkbox">Toggle Menu</label>
    <div id="sk-sidebar-wrapper" class="border-right">
      <div class="sk-sidebar-toc-wrapper">
        <div class="sk-sidebar-toc-logo">
          <a href="index.html">
            <img
              class="sk-brand-img"
              src="_static/scikit-learn-logo-small.png"
              alt="logo"/>
          </a>
        </div>
        <div class="btn-group w-100 mb-2" role="group" aria-label="rellinks">
            <a href="whats_new/older_versions.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Version 0.12.1">Prev</a><a href="preface.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Welcome to scikit-learn">Up</a>
            <a href="governance.html" role="button" class="btn sk-btn-rellink py-1" sk-rellink-tooltip="Scikit-learn governance and decision-making">Next</a>
        </div>
        <div class="alert alert-danger p-1 mb-2" role="alert">
          <p class="text-center mb-0">
          <strong>scikit-learn 0.22</strong><br/>
          <a href="http://scikit-learn.org/dev/versions.html">Other versions</a>
          </p>
        </div>
        <div class="alert alert-warning p-1 mb-2" role="alert">
          <p class="text-center mb-0">
            Please <a class="font-weight-bold" href="about.html#citing-scikit-learn"><string>cite us</string></a> if you use the software.
          </p>
        </div>
          <div class="sk-sidebar-toc">
            <ul>
<li><a class="reference internal" href="#">Roadmap</a><ul>
<li><a class="reference internal" href="#purpose-of-this-document">Purpose of this document</a></li>
<li><a class="reference internal" href="#statement-of-purpose-scikit-learn-in-2018">Statement of purpose: Scikit-learn in 2018</a></li>
<li><a class="reference internal" href="#architectural-general-goals">Architectural / general goals</a></li>
<li><a class="reference internal" href="#subpackage-specific-goals">Subpackage-specific goals</a></li>
</ul>
</li>
</ul>

          </div>
      </div>
    </div>
    <div id="sk-page-content-wrapper">
      <div class="sk-page-content container-fluid body px-md-3" role="main">
        
  <div class="section" id="roadmap">
<span id="id1"></span><h1>Roadmap<a class="headerlink" href="#roadmap" title="Permalink to this headline">¶</a></h1>
<div class="section" id="purpose-of-this-document">
<h2>Purpose of this document<a class="headerlink" href="#purpose-of-this-document" title="Permalink to this headline">¶</a></h2>
<p>This document list general directions that core contributors are interested
to see developed in scikit-learn. The fact that an item is listed here is in
no way a promise that it will happen, as resources are limited. Rather, it
is an indication that help is welcomed on this topic.</p>
</div>
<div class="section" id="statement-of-purpose-scikit-learn-in-2018">
<h2>Statement of purpose: Scikit-learn in 2018<a class="headerlink" href="#statement-of-purpose-scikit-learn-in-2018" title="Permalink to this headline">¶</a></h2>
<p>Eleven years after the inception of Scikit-learn, much has changed in the
world of machine learning. Key changes include:</p>
<ul class="simple">
<li><p>Computational tools: The exploitation of GPUs, distributed programming
frameworks like Scala/Spark, etc.</p></li>
<li><p>High-level Python libraries for experimentation, processing and data
management: Jupyter notebook, Cython, Pandas, Dask, Numba…</p></li>
<li><p>Changes in the focus of machine learning research: artificial intelligence
applications (where input structure is key) with deep learning,
representation learning, reinforcement learning, domain transfer, etc.</p></li>
</ul>
<p>A more subtle change over the last decade is that, due to changing interests
in ML, PhD students in machine learning are more likely to contribute to
PyTorch, Dask, etc. than to Scikit-learn, so our contributor pool is very
different to a decade ago.</p>
<p>Scikit-learn remains very popular in practice for trying out canonical
machine learning techniques, particularly for applications in experimental
science and in data science. A lot of what we provide is now very mature.
But it can be costly to maintain, and we cannot therefore include arbitrary
new implementations. Yet Scikit-learn is also essential in defining an API
framework for the development of interoperable machine learning components
external to the core library.</p>
<p><strong>Thus our main goals in this era are to</strong>:</p>
<ul class="simple">
<li><p>continue maintaining a high-quality, well-documented collection of canonical
tools for data processing and machine learning within the current scope
(i.e. rectangular data largely invariant to column and row order;
predicting targets with simple structure)</p></li>
<li><p>improve the ease for users to develop and publish external components</p></li>
<li><p>improve inter-operability with modern data science tools (e.g. Pandas, Dask)
and infrastructures (e.g. distributed processing)</p></li>
</ul>
<p>Many of the more fine-grained goals can be found under the <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3AAPI">API tag</a>
on the issue tracker.</p>
</div>
<div class="section" id="architectural-general-goals">
<h2>Architectural / general goals<a class="headerlink" href="#architectural-general-goals" title="Permalink to this headline">¶</a></h2>
<p>The list is numbered not as an indication of the order of priority, but to
make referring to specific points easier. Please add new entries only at the
bottom. Note that the crossed out entries are already done, and we try to keep
the document up to date as we work on these issues.</p>
<ol class="arabic simple">
<li><p>Improved handling of Pandas DataFrames</p>
<ul class="simple">
<li><p>document current handling</p></li>
<li><p>column reordering issue <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/7242">#7242</a></p></li>
<li><p>avoiding unnecessary conversion to ndarray <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/12147">#12147</a></p></li>
<li><p>returning DataFrames from transformers <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/5523">#5523</a></p></li>
<li><p>getting DataFrames from dataset loaders <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/10733">#10733</a>,
<strike> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/13902">#13902</a> </strike></p></li>
<li><p>Sparse currently not considered <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/12800">#12800</a></p></li>
</ul>
</li>
<li><p>Improved handling of categorical features</p>
<ul class="simple">
<li><p>Tree-based models should be able to handle both continuous and categorical
features <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/12866">#12866</a> and <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/15550">#15550</a>.</p></li>
<li><p><strike> In dataset loaders <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/13902">#13902</a> </strike></p></li>
<li><p>As generic transformers to be used with ColumnTransforms (e.g. ordinal
encoding supervised by correlation with target variable) <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/5853">#5853</a>,
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/11805">#11805</a></p></li>
<li><p>Handling mixtures of categorical and continuous variables</p></li>
</ul>
</li>
<li><p>Improved handling of missing data</p>
<ul class="simple">
<li><p>Making sure meta-estimators are lenient towards missing data,
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/15319">#15319</a></p></li>
<li><p>Non-trivial imputers <strike> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/11977">#11977</a>, <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/12852">#12852</a> </strike></p></li>
<li><p>Learners directly handling missing data <strike> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/13911">#13911</a> </strike></p></li>
<li><p>An amputation sample generator to make parts of a dataset go missing
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6284">#6284</a></p></li>
</ul>
</li>
<li><p>More didactic documentation</p>
<ul class="simple">
<li><p>More and more options have been added to scikit-learn. As a result, the
documentation is crowded which makes it hard for beginners to get the big
picture. Some work could be done in prioritizing the information.</p></li>
</ul>
</li>
<li><p>Passing around information that is not (X, y): Sample properties</p>
<ul class="simple">
<li><p>We need to be able to pass sample weights to scorers in cross validation.</p></li>
<li><p>We should have standard/generalised ways of passing sample-wise properties
around in meta-estimators. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/4497">#4497</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/7646">#7646</a></p></li>
</ul>
</li>
<li><p>Passing around information that is not (X, y): Feature properties</p>
<ul class="simple">
<li><p>Feature names or descriptions should ideally be available to fit for, e.g.
. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6425">#6425</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6424">#6424</a></p></li>
<li><p>Per-feature handling (e.g. “is this a nominal / ordinal / English language
text?”) should also not need to be provided to estimator constructors,
ideally, but should be available as metadata alongside X. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8480">#8480</a></p></li>
</ul>
</li>
<li><p>Passing around information that is not (X, y): Target information</p>
<ul class="simple">
<li><p>We have problems getting the full set of classes to all components when
the data is split/sampled. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6231">#6231</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8100">#8100</a></p></li>
<li><p>We have no way to handle a mixture of categorical and continuous targets.</p></li>
</ul>
</li>
<li><p>Make it easier for external users to write Scikit-learn-compatible
components</p>
<ul class="simple">
<li><p>More flexible estimator checks that do not select by estimator name
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6599">#6599</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6715">#6715</a></p></li>
<li><p>Example of how to develop an estimator or a meta-estimator, <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/14582">#14582</a></p></li>
<li><p>More self-sufficient running of scikit-learn-contrib or a similar resource</p></li>
</ul>
</li>
<li><p>Support resampling and sample reduction</p>
<ul class="simple">
<li><p>Allow subsampling of majority classes (in a pipeline?) <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/3855">#3855</a></p></li>
<li><p>Implement random forests with resampling <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8732">#8732</a></p></li>
</ul>
</li>
<li><p>Better interfaces for interactive development</p>
<ul class="simple">
<li><p><strike> __repr__ </strike> and HTML visualisations of estimators
<strike> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6323">#6323</a> </strike> and <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/pull/14180">#14180</a>.</p></li>
<li><p>Include plotting tools, not just as examples. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/9173">#9173</a></p></li>
</ul>
</li>
<li><p>Improved tools for model diagnostics and basic inference</p>
<ul class="simple">
<li><p><strike> alternative feature importances implementations, <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/13146">#13146</a> </strike></p></li>
<li><p>better ways to handle validation sets when fitting</p></li>
<li><p>better ways to find thresholds / create decision rules <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8614">#8614</a></p></li>
</ul>
</li>
<li><p>Better tools for selecting hyperparameters with transductive estimators</p>
<ul class="simple">
<li><p>Grid search and cross validation are not applicable to most clustering
tasks. Stability-based selection is more relevant.</p></li>
</ul>
</li>
<li><p>Better support for manual and automatic pipeline building</p>
<ul class="simple">
<li><p>Easier way to construct complex pipelines and valid search spaces
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/7608">#7608</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/5082">#5082</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8243">#8243</a></p></li>
<li><p>provide search ranges for common estimators??</p></li>
<li><p>cf. <a class="reference external" href="https://searchgrid.readthedocs.io/en/latest/">searchgrid</a></p></li>
</ul>
</li>
<li><p>Improved tracking of fitting</p>
<ul class="simple">
<li><p>Verbose is not very friendly and should use a standard logging library
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6929">#6929</a>, <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/78">#78</a></p></li>
<li><p>Callbacks or a similar system would facilitate logging and early stopping</p></li>
</ul>
</li>
<li><p>Distributed parallelism</p>
<ul class="simple">
<li><p>Accept data which complies with <code class="docutils literal notranslate"><span class="pre">__array_function__</span></code></p></li>
</ul>
</li>
<li><p>A way forward for more out of core</p>
<ul class="simple">
<li><p>Dask enables easy out-of-core computation. While the Dask model probably
cannot be adaptable to all machine-learning algorithms, most machine
learning is on smaller data than ETL, hence we can maybe adapt to very
large scale while supporting only a fraction of the patterns.</p></li>
</ul>
</li>
<li><p>Support for working with pre-trained models</p>
<ul class="simple">
<li><p>Estimator “freezing”. In particular, right now it’s impossible to clone a
<code class="docutils literal notranslate"><span class="pre">CalibratedClassifierCV</span></code> with prefit. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8370">#8370</a>. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/6451">#6451</a></p></li>
</ul>
</li>
<li><p>Backwards-compatible de/serialization of some estimators</p>
<ul class="simple">
<li><p>Currently serialization (with pickle) breaks across versions. While we may
not be able to get around other limitations of pickle re security etc, it
would be great to offer cross-version safety from version 1.0. Note: Gael
and Olivier think that this can cause heavy maintenance burden and we
should manage the trade-offs. A possible alternative is presented in the
following point.</p></li>
</ul>
</li>
<li><p>Documentation and tooling for model lifecycle management</p>
<ul class="simple">
<li><p>Document good practices for model deployments and lifecycle: before
deploying a model: snapshot the code versions (numpy, scipy, scikit-learn,
custom code repo), the training script and an alias on how to retrieve
historical training data + snapshot a copy of a small validation set +
snapshot of the predictions (predicted probabilities for classifiers)
on that validation set.</p></li>
<li><p>Document and tools to make it easy to manage upgrade of scikit-learn
versions:</p>
<ul>
<li><p>Try to load the old pickle, if it works, use the validation set
prediction snapshot to detect that the serialized model still behave
the same;</p></li>
<li><p>If joblib.load / pickle.load not work, use the versioned control
training script + historical training set to retrain the model and use
the validation set prediction snapshot to assert that it is possible to
recover the previous predictive performance: if this is not the case
there is probably a bug in scikit-learn that needs to be reported.</p></li>
</ul>
</li>
</ul>
</li>
<li><p>Everything in Scikit-learn should probably conform to our API contract.
We are still in the process of making decisions on some of these related
issues.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Pipeline</span> <span class="pre">&lt;pipeline.Pipeline&gt;</span></code> and <code class="docutils literal notranslate"><span class="pre">FeatureUnion</span></code> modify their input
parameters in fit. Fixing this requires making sure we have a good
grasp of their use cases to make sure all current functionality is
maintained. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/8157">#8157</a> <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/7382">#7382</a></p></li>
</ul>
</li>
<li><p>(Optional) Improve scikit-learn common tests suite to make sure that (at
least for frequently used) models have stable predictions across-versions
(to be discussed);</p>
<ul class="simple">
<li><p>Extend documentation to mention how to deploy models in Python-free
environments for instance  <a class="reference external" href="https://github.com/onnx/onnxmltools">ONNX</a>.
and use the above best practices to assess predictive consistency between
scikit-learn and ONNX prediction functions on validation set.</p></li>
<li><p>Document good practices to detect temporal distribution drift for deployed
model and good practices for re-training on fresh data without causing
catastrophic predictive performance regressions.</p></li>
</ul>
</li>
</ol>
</div>
<div class="section" id="subpackage-specific-goals">
<h2>Subpackage-specific goals<a class="headerlink" href="#subpackage-specific-goals" title="Permalink to this headline">¶</a></h2>
<p><a class="reference internal" href="modules/classes.html#module-sklearn.ensemble" title="sklearn.ensemble"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.ensemble</span></code></a></p>
<ul class="simple">
<li><p><strike> a stacking implementation, <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/11047">#11047</a> </strike></p></li>
</ul>
<p><a class="reference internal" href="modules/classes.html#module-sklearn.cluster" title="sklearn.cluster"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.cluster</span></code></a></p>
<ul class="simple">
<li><p>kmeans variants for non-Euclidean distances, if we can show these have
benefits beyond hierarchical clustering.</p></li>
</ul>
<p><a class="reference internal" href="modules/classes.html#module-sklearn.model_selection" title="sklearn.model_selection"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.model_selection</span></code></a></p>
<ul class="simple">
<li><p><strike> multi-metric scoring is slow <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/9326">#9326</a> </strike></p></li>
<li><p>perhaps we want to be able to get back more than multiple metrics</p></li>
<li><p>the handling of random states in CV splitters is a poor design and
contradicts the validation of similar parameters in estimators,
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/15177">#15177</a></p></li>
<li><p>exploit warm-starting and path algorithms so the benefits of <code class="docutils literal notranslate"><span class="pre">EstimatorCV</span></code>
objects can be accessed via <code class="docutils literal notranslate"><span class="pre">GridSearchCV</span></code> and used in Pipelines.
<a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/1626">#1626</a></p></li>
<li><p>Cross-validation should be able to be replaced by OOB estimates whenever a
cross-validation iterator is used.</p></li>
<li><p>Redundant computations in pipelines should be avoided (related to point
above) cf <a class="reference external" href="https://dask-ml.readthedocs.io/en/latest/hyper-parameter-search.html#avoid-repeated-work">daskml</a></p></li>
</ul>
<p><a class="reference internal" href="modules/classes.html#module-sklearn.neighbors" title="sklearn.neighbors"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.neighbors</span></code></a></p>
<ul class="simple">
<li><p><strike> Ability to substitute a custom/approximate/precomputed nearest neighbors
implementation for ours in all/most contexts that nearest neighbors are used
for learning. <a class="reference external" href="https://github.com/scikit-learn/scikit-learn/issues/10463">#10463</a> </strike></p></li>
</ul>
<p><a class="reference internal" href="modules/classes.html#module-sklearn.pipeline" title="sklearn.pipeline"><code class="xref py py-mod docutils literal notranslate"><span class="pre">sklearn.pipeline</span></code></a></p>
<ul class="simple">
<li><p>Performance issues with <code class="docutils literal notranslate"><span class="pre">Pipeline.memory</span></code></p></li>
<li><p>see “Everything in Scikit-learn should conform to our API contract” above</p></li>
</ul>
</div>
</div>


      </div>
    <div class="container">
      <footer class="sk-content-footer">
            &copy; 2007 - 2019, scikit-learn developers (BSD License).
          <a href="_sources/roadmap.rst.txt" rel="nofollow">Show this page source</a>
      </footer>
    </div>
  </div>
</div>
<script src="_static/js/vendor/bootstrap.min.js"></script>

<script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    ga('create', 'UA-22606712-2', 'auto');
    ga('set', 'anonymizeIp', true);
    ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>


<script>
$(document).ready(function() {
    /* Add a [>>>] button on the top-right corner of code samples to hide
     * the >>> and ... prompts and the output and thus make the code
     * copyable. */
    var div = $('.highlight-python .highlight,' +
                '.highlight-python3 .highlight,' +
                '.highlight-pycon .highlight,' +
		'.highlight-default .highlight')
    var pre = div.find('pre');

    // get the styles from the current theme
    pre.parent().parent().css('position', 'relative');
    var hide_text = 'Hide prompts and outputs';
    var show_text = 'Show prompts and outputs';

    // create and add the button to all the code blocks that contain >>>
    div.each(function(index) {
        var jthis = $(this);
        if (jthis.find('.gp').length > 0) {
            var button = $('<span class="copybutton">&gt;&gt;&gt;</span>');
            button.attr('title', hide_text);
            button.data('hidden', 'false');
            jthis.prepend(button);
        }
        // tracebacks (.gt) contain bare text elements that need to be
        // wrapped in a span to work with .nextUntil() (see later)
        jthis.find('pre:has(.gt)').contents().filter(function() {
            return ((this.nodeType == 3) && (this.data.trim().length > 0));
        }).wrap('<span>');
    });

    // define the behavior of the button when it's clicked
    $('.copybutton').click(function(e){
        e.preventDefault();
        var button = $(this);
        if (button.data('hidden') === 'false') {
            // hide the code output
            button.parent().find('.go, .gp, .gt').hide();
            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
            button.css('text-decoration', 'line-through');
            button.attr('title', show_text);
            button.data('hidden', 'true');
        } else {
            // show the code output
            button.parent().find('.go, .gp, .gt').show();
            button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
            button.css('text-decoration', 'none');
            button.attr('title', hide_text);
            button.data('hidden', 'false');
        }
    });

	/*** Add permalink buttons next to glossary terms ***/
	$('dl.glossary > dt[id]').append(function() {
		return ('<a class="headerlink" href="#' +
			    this.getAttribute('id') +
			    '" title="Permalink to this term">¶</a>');
	});
  /*** Hide navbar when scrolling down ***/
  // Returns true when headerlink target matches hash in url
  (function() {
    hashTargetOnTop = function() {
        var hash = window.location.hash;
        if ( hash.length < 2 ) { return false; }

        var target = document.getElementById( hash.slice(1) );
        if ( target === null ) { return false; }

        var top = target.getBoundingClientRect().top;
        return (top < 2) && (top > -2);
    };

    // Hide navbar on load if hash target is on top
    var navBar = document.getElementById("navbar");
    var navBarToggler = document.getElementById("sk-navbar-toggler");
    var navBarHeightHidden = "-" + navBar.getBoundingClientRect().height + "px";
    var $window = $(window);

    hideNavBar = function() {
        navBar.style.top = navBarHeightHidden;
    };

    showNavBar = function() {
        navBar.style.top = "0";
    }

    if (hashTargetOnTop()) {
        hideNavBar()
    }

    var prevScrollpos = window.pageYOffset;
    hideOnScroll = function(lastScrollTop) {
        if (($window.width() < 768) && (navBarToggler.getAttribute("aria-expanded") === 'true')) {
            return;
        }
        if (lastScrollTop > 2 && (prevScrollpos <= lastScrollTop) || hashTargetOnTop()){
            hideNavBar()
        } else {
            showNavBar()
        }
        prevScrollpos = lastScrollTop;
    };

    /*** high preformance scroll event listener***/
    var raf = window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        window.oRequestAnimationFrame;
    var lastScrollTop = $window.scrollTop();

    if (raf) {
        loop();
    }

    function loop() {
        var scrollTop = $window.scrollTop();
        if (lastScrollTop === scrollTop) {
            raf(loop);
            return;
        } else {
            lastScrollTop = scrollTop;
            hideOnScroll(lastScrollTop);
            raf(loop);
        }
    }
  })();
});

</script>
    
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
    
</body>
</html>